Linux 下编译实现C/Fortran调用动态库

您所在的位置:网站首页 ubuntu 编译运行c Linux 下编译实现C/Fortran调用动态库

Linux 下编译实现C/Fortran调用动态库

#Linux 下编译实现C/Fortran调用动态库 | 来源: 网络整理| 查看: 265

目录

Fortran语言

格式

Windows Linux下动态库介绍

windows下obj, lib, dll, exe的关系

linux .o, .a, .so

生成动态库Demo

查看动态库中的函数

Fortran语言

FORTRAN语言是Formula Translation的缩写,意为“公式翻译”。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的,其数值计算的功能较强。

FORTRAN语言是世界上第一个被正式推广使用的高级语言。它是1954年被提出来的,1956年开始正式使用,直到2022年已有六十六年的历史,但仍历久不衰,它始终是数值计算领域所使用的主要语言。

Fortran 语言学习(菜鸟都可以看得懂的入门级教程)(持续更新中ing…)_caorui_blog的博客-CSDN博客_fortran

什么是动态库?什么又是静态库?(如何生成/如何使用 ! ! !)_小羊教你来编程的博客-CSDN博客_动态库  

格式

Linux 下编译实现C/Fortran调用动态库

a6ea38b4358132c07bf0e8bdb2a4f3d3.png Windows linux下动态库介绍

linux中.o时什么文件,Linux的.a、.so和.o文件_GUlijiwa古力的博客-CSDN博客

windows下obj, lib, dll, exe的关系

lib是和dll对应的。lib是静态链接库的库文件,dll是动态链接库的库文件。 所谓静态就是link的时候把里面需要的东西抽取出来安排到你的exe文件中,以后运行你的exe的时候不再需要lib。 所谓动态就是exe运行的时候依赖于dll里面提供的功能,没有这个dll,你的exe无法运行。 lib,dll,exe都算是最终的目标文件,是最终产物。而c/c++属于源代码。源代码和最终目标文件中过渡的就是中间代码obj,实际上之所以需要中间代码,是你不可能一次得到目标文件。比如说一个exe需要很多的cpp文件生成。而编译器一次只能编译一个cpp文件。这样编译器编译好一个cpp以后会将其编译成obj,当所有必须要的cpp都编译成obj以后,再统一link成所需要的exe,应该说缺少任意一个obj都会导致exe的链接失败。

linux .o, .a, .so

对比Windows下的文件:.o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,相当于windows下的dll .a 为静态库,是好多个.o合在一起,用于静态连接  

生成动态库Demo

前提是当前Linux操作系统需要有gfortran gcc g++等编译器。

sub.f90 :

subroutine Sub_Fortran(NumInt,NumFloat,NumDouble) // 求幂的函数 implicit none integer :: NumInt real :: NumFloat real(8) :: NumDouble NumDouble=NumFloat**NumInt end subroutine real(8) function Function_Fortran(NumDouble) // 开方的函数 implicit none real(8) :: NumDouble Function_Fortran=sqrt(NumDouble) end function

main.c:

#include void sub_fortran_(int * num_int,float * num_float,double * num_double);// 求幂函数 double function_fortran_(double *);//开方 // int main() { int num_int; float num_float; double num_double; double num; num_int=4; num_float=2.0; sub_fortran_(&num_int,&num_float,&num_double); num=function_fortran_(&num_double); // 输出开方后的数 应该是 4 printf("num_int=%d \n num_float=%f \n num_double=%f \n num=%f \n",num_int,num_float,num_double,num+1 ); return 0; }

在当前目录下依次执行:

gfortran -c -fpic sub.f90          把sub.f90       生成sub.o 目标文件 gfortran -shared -o sub.so sub.o       将sub.o链接生成动态库   // gfortran main.f90 sub.so -o main       如果主函数是用fortran写的可以这样执行 gcc main.c sub.so -o main         生成可执行文件 LD_LIBRARY_PATH=. ./main               

显示:

Linux 下编译实现C/Fortran调用动态库

Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件。

在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用。

程序执行时,再去加载动态库文件。如果动态库已经加载,则不必重复加载,从而能节省内存空间。

Linux下生成和使用动态库的步骤如下:

编写源文件。 将一个或几个源文件编译链接,生成共享库。 通过 -L -lxxx 的gcc选项链接生成的libxxx.so。 把libxxx.so放入链接库的标准路径,或指定 LD_LIBRARY_PATH,才能运行链接了libxxx.so的程序。 查看动态库中的函数

通过下列指令查看fortran文件中导出的函数

nm -D XXX.so

readelf -s XXX.so 

Linux 下编译实现C/Fortran调用动态库

中间一栏是T的代表导出的函数名



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3